#include <stdio.h>
#include <sys/types.h>
#define FALSE	0 
#define TRUE	1

/* 缓冲区 slot 槽的数量 */ 
#define N 100
struct queue{ pid_t pid;};

// typedef struct {
// 	int value;
// 	struct queue wq;
// } semaphore;
typedef int semaphore;
extern void down(semaphore *);
extern void up(semaphore *);

int produce_item(void) { 
	static int item = 0; 
	return ++item; 
}

void consumer_item(int item) {
	printf("Consumed: %d\n", item); 
}
 
void insert_item(int item) {

}

int remove_item(void) {
	return 0;
}

/* 标明缓存区有空位置的个数 */
semaphore empty = N;		// 缓存区初始化时有N个空位
/* 标明缓存区已经放入资源的数量 */
semaphore full = 0;			// 缓存区初始化时有0个可用资源
/* 控制区临界区互斥访问 */
semaphore mutex = 1;		// 表示互斥锁

// 生产者
void producer(void ) {
	int item;

	while (TRUE) {
		item = produce_item();
		down(&empty);    // 等待缓存区有空位置
		down(&mutex);
		insert_item(item);
		up(&mutex);
		up(&full);		//没有东西可拿消费睡眠 生产一个后唤醒
	}
}

// 消费者
void consumer(void ) {
	int item;

	while (TRUE) {
		down(&full);    // 等待缓存区有东西
		down(&mutex);
		item = remove_item();
		up(&mutex);
		up(&empty);     //没有空位置时生产睡眠 拿走一个后就唤醒
		consumer_item(item);
	}
}
